1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
   | 
  #include <stdio.h> #include <string.h> #include <stdlib.h>
  int a[500005], real[500005], n; long long tree[500005];
  int cmp(const void* a, const void* b) {     return *(const int*)a - *(const int*)b; }
  void update(int i) {     while (i)     {         ++tree[i];         i -= i & -i;     } }
  long long query(int i) {     long long ans = 0LL;     while (i <= n)     {         ans += tree[i];         i += i & -i;     }     return ans; }
  int bfind(int val) {     int l = 0, r = n - 1, m = (l + r) >> 1;     while (l <= r)     {         if (real[m] < val)             l = m + 1;         else if (real[m] > val)             r = m - 1;         else             return m + 1;         m = (l + r) >> 1;     }     return 0; }
  int main() {     int i;     while (scanf("%d", &n), n)     {         long long ans = 0LL;         memset(tree, 0, sizeof(tree));         for (i = 0; i < n; ++i)         {             scanf("%d", a + i);             real[i] = a[i];         }         qsort(real, n, sizeof(int), cmp);         for (i = 0; i < n; ++i)         {             a[i] = bfind(a[i]);             ans += query(a[i]);             update(a[i] - 1);         }         printf("%I64d\n", ans);     }     return 0; }
 
  |